#include <stdio.h>    // 包含标准输入输出库
#include <stdlib.h>   // 包含标准库
#define MAXSIZE 100   // 定义顺序表的最大容量为100
typedef int ElemType; // 定义元素类型为整型

/**
 * 顺序表结构体定义
 * data: 存储数据元素的数组
 * length: 当前顺序表的长度
 */
typedef struct SeqList 
{
    ElemType data[MAXSIZE]; // 数据元素数组
    int length;             // 当前顺序表长度
}SeqList;

// 函数声明
void Init_List(SeqList *L);        // 初始化顺序表
int Insert_List(SeqList *L, int pos, ElemType e); // 在指定位置插入元素
int Delete_List(SeqList *L, int pos);           // 删除指定位置的元素
int Find_List(SeqList *L, ElemType e);          // 查找指定元素的位置
void List_Elem(SeqList *L);                     // 遍历输出顺序表元素

/**
 * 主函数
 * 演示顺序表的基本操作：初始化、插入、删除和遍历
 */
int main() 
{
    SeqList L;                     // 定义顺序表变量
    Init_List(&L);                 // 初始化顺序表
    Insert_List(&L, 1, 1);         // 在位置1插入元素1
    Insert_List(&L, 2, 2);         // 在位置2插入元素2
    Insert_List(&L, 3, 3);         // 在位置3插入元素3
    Delete_List(&L, 1);            // 删除位置1的元素
    List_Elem(&L);                 // 遍历输出顺序表元素
    return 0;
}

/**
 * 初始化顺序表
 * @param L 顺序表指针
 * 将顺序表的长度初始化为0
 */
void Init_List(SeqList *L) 
{
    L->length = 0;  // 初始长度为0，表示空表
}

/**
 * 在顺序表的指定位置插入元素
 * @param L 顺序表指针
 * @param pos 插入位置（从1开始计数）
 * @param e 要插入的元素值
 * @return 成功返回1，失败返回0
 */
int Insert_List(SeqList *L, int pos, ElemType e) 
{
    // 检查顺序表是否已满
    if(L->length >= MAXSIZE) 
    {
        printf("顺序表已满\n");
        return 0;
    }
    
    // 检查插入位置是否有效
    if(pos < 1 || pos > L->length + 1)
    {
        printf("插入位置有误\n");
        return 0;
    }
    
    // 从最后一个元素开始，向后移动元素，为新元素腾出空间
    for(int i = L->length - 1; i >= pos - 1; i--) 
    {
        L->data[i+1] = L->data[i];
    }
    
    // 在指定位置插入新元素
    L->data[pos-1] = e;
    
    // 顺序表长度加1
    L->length++;
    
    return 1;
}

/**
 * 删除顺序表中指定位置的元素
 * @param L 顺序表指针
 * @param pos 删除位置（从1开始计数）
 * @return 成功返回1，失败返回0
 */
int Delete_List(SeqList *L, int pos) 
{
    // 检查顺序表是否为空
    if(L->length == 0) 
    {
        printf("空表\n");
        return 0;  // 空表无法删除，返回失败
    }
    
    // 检查删除位置是否有效
    if(pos < 1 || pos > L->length) 
    {
        printf("插入位置有误\n");  // 注释应该改为"删除位置有误"
        return 0;
    }
    
    // 如果删除的不是最后一个元素，需要将后续元素向前移动
    if(pos < L->length) 
    {
        for(int i = pos; i < L->length; i++) 
        {
            L->data[i-1] = L->data[i];
        }
    }
    
    // 顺序表长度减1
    L->length--;
    
    return 1;
}

/**
 * 在顺序表中查找指定元素
 * @param L 顺序表指针
 * @param e 要查找的元素值
 * @return 找到返回元素位置（从1开始计数），未找到返回1（这里存在问题，应该返回0或其他标识）
 */
int Find_List(SeqList *L, ElemType e) 
{
    // 顺序查找元素
    for(int i = 0; i < L->length; i++) 
    {
        if(L->data[i] == e) 
        {
            return i + 1;  // 找到元素，返回位置（从1开始）
        }
    }
    
    // 未找到元素，这里返回1存在逻辑问题
    // 建议改为返回0或-1来表示未找到
    return 1;  // 错误：未找到元素时返回1，与位置1冲突
}

/**
 * 遍历输出顺序表中的所有元素
 * @param L 顺序表指针
 */
void List_Elem(SeqList *L) 
{
    // 遍历顺序表并打印每个元素
    for(int i = 0; i < L->length; i++) 
    {
        printf("%d\n", L->data[i]);
    }
}